<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Object</title>
</head>

<body>
    <p>Object 是内置的构造函数，用于创建普通对象。</p>
    <p>
        总结： <br>
        1. 推荐使用字面量方式声明对象，而不是 Object 构造函数 <br>
        2. Object.assign 静态方法创建新的对象 <br>
        3. Object.keys 静态方法获取对象中所有属性 <br>
        4. Object.values 表态方法获取对象中所有属性值
    </p>
    <p>
        Object.assign 静态方法创建新的对象：<br>
        Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。这可以用于合并对象或给对象添加属性。
    </p>
    <p>
        Object.keys 静态方法获取对象中所有属性：<br>
        Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组，数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致（两者的主要区别是 for...in
        循环还会枚举其原型链上的属性）。
    </p>
    <p>
        Object.values 静态方法获取对象中所有属性值 <br>
        Object.values() 方法返回一个给定对象自身的所有可枚举属性值的数组，值的顺序与使用 for...in 循环遍历该对象时返回的顺序一致（但 for...in 还会枚举原型链中的属性）。
    </p>

    <script>
        // 通过构造函数创建普通对象
        const user = new Object({ name: '小明', age: 15 })
        // 这种方式声明的变量为【字面量】
        let student = { name: '杜建华', age: 21 }

        // 对象语法简写
        let name = '小红'
        let people = {
            // 相当于name: name
            name,
            // 相当于 walk: function() {}
            walk() {
                console.log('人都是要走路。。。');
            }
        }
        console.log(student.constructor); // ƒ Object() { [native code] }
        console.log(user.constructor); // ƒ Object() { [native code] }
        console.log(student instanceof Object); // true



        let target = { a: 1, b: 2 };
        let source = { b: 4, c: 5 };
        let returnedTarget = Object.assign(target, source);
        console.log(target);
        // 输出: Object { a: 1, b: 4, c: 5 }  
        console.log(returnedTarget === target);
        // 输出: true，因为Object.assign是就地修改并返回目标对象


        let obj = { a: 'somestring', b: 42, c: false };
        console.log(Object.keys(obj));   // 输出: ["a", "b", "c"]

        let obj2 = { foo: 'bar', baz: 42 };
        console.log(Object.values(obj2));  // 输出: ["bar", 42]

    </script>

</body>

</html>